from redis import Redis
# 引入mongodb
from pymongo import MongoClient
# 引入json
import json
r = Redis(host="127.0.0.1",port="6379",db=1,decode_responses=True)
# 连接mongodb的re数据库
c = MongoClient(host="127.0.0.1",port=27017)
# 通过mongodb的re数据库中的dis集合
m = c["re"]["dis"]
# 插入文档 insert_many
docs = [{
	"name":"张三",
	"age":29,
	"score":9
},{
	"name":"李四",
	"age":19,
	"score":3
},{
	"name":"王五",
	"age":26,
	"score":8
}]
try:
    if m.count_documents(docs[0])>0:
        raise ValueError("该数据已存在，请勿重复插入")
    m.insert_many(docs)
except Exception as err:
    print(err)
# 2. 查询出所有的内容，插入到redis的列表 stus
data = m.aggregate([
    {
        "$match":
            {"_id":{"$ne":1}}
    },
    {"$project":{"_id":0}}
]) 
# _id的默认值是ObejectId，不能直接转换为string字符串类型
# 类似Python列表的对象 使用for in操作时不需要事先转换为list列表（python)
dd = [json.dumps(d) for d in data] # 列表推导式
# redis列表的元素只能是字符串，文档的数据是一个字典（对象）
# json是长得像对象的字符串 所以可以引入json来完成redis的列表
r.delete("stus")
r.rpush("stus",*dd)
stuslist = r.lrange("stus",0,-1)
stus = [json.loads(s) for s in stuslist]
print(stus) #[{'name': '张三', 'age': 29, 'score': 9}, {'name': '李四', 'age': 19, 'score': 3}, {'name': '王五', 'age': 26, 'score': 8}]
# 3. 查询出所有的name(管道查询)，插入到redis的集合中 name_set
data = m.aggregate([
    {
        "$match":{
            "_id":{"$ne":1}
        }
    },{
        "$project":{
            "_id":0,
            "name":1
         }
    }
])
names = [d["name"] for d in data]

r.sadd("name_set",*names)
print(r.smembers("name_set")) #{'王五', '李四', '张三'}

# 4. 查询出所有数据，存放至hash散列 stu_hash
# hash散列是一个对象的多个属性
data=m.find({"_id":{"$ne":1}})# 查询出所有数据
i=0
# r.delete("stu_hash0","stu_hash1","stu_hash2")
for k in data:
    h = k.pop("_id") # _id的默认值是ObjectId没有办法直接使用
    # k.pop就是将k字典里面的_id吐出来 结果为该_id的值
    r.hset(f"stu_hash{i}","id",str(h),k)
    i=i+1
hashs = r.keys("stu_hash*") #[stu_hash0,stu_hash1,stu_hash2]
for h in hashs:
    print(r.hgetall(h))

# 4. 查询出所有的name和age, 插入到redis的有序集合中，年龄从小到大输出 age_zset
m.delete_one({"张三":98})
data = m.aggregate([{"$project":{"_id":0,"name":1,"age":1}}])
maps ={}
for d in data:
    maps[d['name']]=d['age']
r.zadd("age_zz",maps)
print(r.zrange("age_zz",0,-1,withscores=True)) 
#[('李四', 19.0), ('王五', 26.0), ('张三', 29.0)]
# 5. 查询出所有的name和score,插入到redis的有序集合，输出6分以上的个数 score_zset
data = m.aggregate([{"$project":{"_id":0,"name":1,"score":1}}])
maps = {}
for d in data:
    maps[d['name']]=d['score']
r.zadd("score_zz",maps)
print(r.zcount("score_zz",6,100)) # 2
'''
作业：
    清空mongodb数据库
    添加元素时添加图片
    启动pyproject项目    
    在src文件夹下创建cache.py
        仿照models.py 完成redis操作的对象化
            引入redis
            class R{
                初始化
            }
'''

